10進数をIEEE 754 binary32で表現してみる
浮動小数点数の内部表現を理解するため、10進数を手作業で浮動小数点数の内部表現(IEEE 754 binary32)へ変換してみる
お題
「-118.625」(10進数)を binary32 (IEEE 754の単精度32ビット表現)へ変換する
binary32の内部形式
https://gyazo.com/5f25dd675f98628805c828649fccc4f1
符号 (1bit)
指数部 (8bit)
仮数部 (23bit)
計算方法
binary32形式
符号 (1bit)
1 (負の数なので1)
まずは10進数を二進数に変換
118を二進数に変換 => 1110110
64 (1)
32 (1)
16 (1)
8 (0)
4 (1)
2 (1)
1 (0)
0.625を二進数に変換 => 0.101
0.5 (1)
0.25 (0)
0.125 (1)
118.625を二進数に変換 => 1110110.101
小数点を左に移動させて1だけ左に残す(浮動小数点数の正規化)
1110110.101
=> 1.110110101 * 2 ^ 6
仮数部 (23bit)
1.110110101 * 2 ^ 6 の小数点部分(0.110110101)が仮数部となる(先頭は常に 1. になるので省略してしまう)
足りない分は0で埋める
仮数部 = 11011010100000000000000
指数部 (8bit)
1.110110101 * 2 ^ 6 より指数は6となるが、バイアスの値127を加えて(IEEE 754のバイアス)127 + 6 = 133 となる 指数部 = 133 = 10000101
符号 + 指数部 + 仮数部
1 + 10000101 + 11011010100000000000000
=> 11000010111011010100000000000000
「-118.625 (10進数)」の binary32 表記は 11000010111011010100000000000000 となる
16進数表記だと 1100_0010_1110_1101_0100_0000_0000_0000 => C2ED4000となる
答え合わせ
浮動小数点数内部表現シミュレーター
11000010111011010100000000000000 ( 手動の計算結果 )
11000010111011010100000000000000 ( シミュレータの計算結果 )
合ってる気がする
C言語を使ってメモリの中をのぞいてみる
こちらも合ってそう